package org.example.operator.transform

import org.apache.spark.rdd.RDD
import org.apache.spark.{SparkConf, SparkContext}

/**
 * rdd的算子，也就是rdd的方法
 *
 * glom 之前说的flatMap是将List->Int
 * 现在将需要将Int->List
 *
 */
object Spark04_RDD_Operator_Glom {
  def main(args: Array[String]): Unit = {

    val conf: SparkConf = new SparkConf().setMaster("local[*]").setAppName("RDD")
    val context = new SparkContext(conf)

    val rdd: RDD[Int] = context.makeRDD(
      List(1,2,3,6),2)


    // 意味着glom函数会将一个有序的内容转换成一个一个数组
    // 之前我们使用了mapPartition的方法进行了分区最大值的求和，我们也可以使用glom
    // 来进行操作，我们在从内存获取一个rdd的时候，设置了两个分区，意味着将会将这四个
    // 数均摊到这两个分区里，同时启动两个线程去处理他们，如果你希望获得两个分区的最大值的话，你可以这么写
    val glomRdd: RDD[Array[Int]] = rdd.glom()
    // 这个glomRdd将会存在两个数组，一号分区，和二号分区，现在你希望求取最大值
    val maxRdd: RDD[Int] = glomRdd.map(intArr => {
      //这里已经是每个分区的的数组
      intArr.max
    })
    //然后进行求和
    println(maxRdd.collect().sum)
    // 且分区内容不变



    context.stop();  }
}
